# 用于计算modbus通信协议的CRC16校验值。
# 举例:0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08得到校验值为0xB0CF（或0xCFB0）

def calc_crc(string):
    data = bytearray.fromhex(string)
    crc = 0xFFFF
    for pos in data:
        crc ^= pos
        for i in range(8):
            if ((crc & 1) != 0):
                crc >>= 1
                crc ^= 0xA001
            else:
                crc >>= 1
    return hex(((crc & 0xff) << 8) + (crc >> 8))

# 02 06 00 02 00 04
crc = calc_crc('020600020004')
print(crc)
#0x29fa


